//package com.liulimi.fastapi.core.aspect;
//
//import com.liulimi.fastapi.utils.json.JsonUtil;
//import com.liulimi.fastapi.utils.serial.SnowflakesUtil;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.annotation.AfterReturning;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Before;
//import org.aspectj.lang.annotation.Pointcut;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.slf4j.MDC;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
//import javax.servlet.http.HttpServletRequest;
//import java.util.Arrays;
//
///**
// * @author chenhao
// * @date 2021/1/12
// * @email 414338069@qq.com
// **/
//@Configuration
//@Aspect
//public class RequestIdAspect {
//
//    private final Logger logger = LoggerFactory.getLogger(RequestIdAspect.class);
//    private static final String REQUEST_ID = "requestId";
//    private static final String ADDRESS = "address";
//
//    /**
//     * 定义切点Pointcut
//     * 第一个*号：表示返回类型， *号表示所有的类型
//     * 第二个*号：表示类名，*号表示所有的类
//     * 第三个*号：表示方法名，*号表示所有的方法
//     * 后面括弧里面表示方法的参数，两个句点表示任何参数
//     */
//    @Pointcut("execution(*  com.liulimi.fastapi.application.controller.*.*(..))")
//    public void executionService() {}
//
//    /**
//     * 方法调用之前调用
//     * @param joinPoint
//     */
//    @Before(value = "executionService()")
//    public void doBefore(JoinPoint joinPoint){
//        String requestId = SnowflakesUtil.getSnowFlakeNumber().toString();
//        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//        String requestUrl = request.getRequestURI();
//        String method = request.getMethod();
//        String remoteAddr = request.getRemoteAddr();
//        MDC.put(ADDRESS,remoteAddr);
//        MDC.put(REQUEST_ID,requestId);
//        logger.info("请求方法:{},请求方式:{},请求参数为：{}",requestUrl,method,JsonUtil.toJsonString(joinPoint.getArgs()));
//    }
//
//    /**
//     * 方法之后调用
//     * @param joinPoint
//     * @param returnValue 方法返回值
//     */
//    @AfterReturning(pointcut = "executionService()",returning="returnValue")
//    public void  doAfterReturning(JoinPoint joinPoint,Object returnValue){
//        logger.info("响应数据为：{}", JsonUtil.toJsonString(returnValue));
//        // 处理完请求，返回内容
//        MDC.clear();
//    }
//}
